package com.thiny.android.game.thunderbolt.role;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;

import com.thiny.android.game.thunderbolt.view.GameView;

/**
 * 基础角色类，各主要角色皆从此处继承
 * 
 * @author THINY
 * 
 */
public abstract class BaseRole {

	// 角色的bitmap，显示在游戏页面使用
	protected Bitmap mRoleBitmap;

	// 角色的bitmap的长宽
	public float BITMAP_WIDTH, BITMAP_HEIGHT;

	// 屏幕的长宽，由手机分辨率决定
	protected float SCREEN_WIDTH, SCREEN_HEIGHT;

	// 游戏画面引用
	protected GameView mGameView;

	// 用于检测碰撞使用
	protected Rect rect;

	// 每个角色的坐标(图片的中心)
	protected float x, y;

	/**
	 * 各种角色类型 包括飞机、子弹、道具
	 * 
	 * 我方战机类型 0：射击一行 1：射击两行 2：射击三行
	 * 
	 * 
	 * 子弹类型
	 * 
	 * 3： 我方战机子弹：伤害为1，小弹 4： 我方战机子弹：伤害为2，大弹
	 * 
	 * 5： 敌机竖直型慢速子弹 6： 敌机竖直型快速子弹 boss专用 7： 敌机跟踪型子弹 向着玩家射击
	 * 
	 * 敌机类型
	 * 
	 * 8： 普通移动型：垂直向下运动 9： 普通移动型：垂直向下运动，水平方向上向着我方战机移动 10：子弹跟踪型：直接子弹射向玩家
	 * 11：突然加速型：先运动一段时间，突然停止射击、加速撞向玩家；
	 * 
	 * 12：第一关boss 3弹 13：第二关boss 4弹 14：第三关boss 5弹
	 * 
	 * 
	 * 道具
	 * 
	 * 15：增加生命值 16：添加子弹 17：换威力弹(杀伤力为2) 18：提升子弹速度 19：清除画面所有(boss除外)
	 * 
	 */
	protected int type;

	// 角色是否生还（即在画面上显示）
	protected boolean isAlive = true;

	// 角色运动方向，主要是子弹类使用
	protected int dir;

	// 默认速度，角色按此速度移动
	protected int speed = 3;

	public BaseRole(GameView gameView, float x, float y, int dir, int type,
			int speed) {
		mGameView = gameView;
		this.x = x;
		this.y = y;
		this.dir = dir;
		this.type = type;
		this.speed = speed;
		setRoleBitmap(type);
		BITMAP_WIDTH = mRoleBitmap.getWidth();
		BITMAP_HEIGHT = mRoleBitmap.getHeight();

		SCREEN_WIDTH = mGameView.getScreenWidth();
		SCREEN_HEIGHT = mGameView.getScreenHeight();

		rect = new Rect();

	}

	// 获取横坐标
	public float getX() {
		return x;
	}

	// 获取纵坐标
	public float getY() {
		return y;
	}

	public void setType(int type) {
		this.type = type;
	}

	// 获取角色类型
	public int getType() {
		return type;
	}

	// 是否生还
	public boolean isAlive() {
		return isAlive;
	}

	public void setAlive(boolean isAlive) {
		this.isAlive = isAlive;
	}

	// 调用该方法，画出该角色
	public void draw(Canvas canvas) {
		canvas.drawBitmap(mRoleBitmap, x - BITMAP_WIDTH / 2, y - BITMAP_HEIGHT
				/ 2, null);
	}

	// 角色是否退出了屏幕
	public boolean isOutOfScreen() {
		if (x < -BITMAP_HEIGHT / 2 || x > (SCREEN_WIDTH + BITMAP_HEIGHT / 2)
				|| y < -BITMAP_HEIGHT / 2
				|| y > (SCREEN_HEIGHT + BITMAP_HEIGHT / 2)) {
			return true;
		}
		return false;
	}

	// 抽象方法，用于设定角色bitmap
	public abstract void setRoleBitmap(int type);

	// 抽象方法，用于设定角色移动行为
	public abstract void move();

	// 获取当前时刻，角色矩形
	public Rect getRoleRect() {
		rect.set((int) (x - BITMAP_WIDTH / 2), (int) (y - BITMAP_HEIGHT / 2),
				(int) (x + BITMAP_WIDTH / 2), (int) (y + BITMAP_HEIGHT / 2));
		return rect;
	}

	// 检测是否碰撞
	public boolean isIntersect(Rect r) {
		return getRoleRect().intersect(r);
	}

}
